package com.example.mykotlinapp.test



/**
 *中位数是有序列表中间的数。如果列表长度是偶数，中位数则是中间两个数的平均值。

例如，

[2,3,4] 的中位数是 3

[2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构：

void addNum(int num) - 从数据流中添加一个整数到数据结构中。
double findMedian() - 返回目前所有元素的中位数。
示例：

addNum(1)
addNum(2)
findMedian() -> 1.5
addNum(3)
findMedian() -> 2
进阶:

如果数据流中所有整数都在 0 到 100 范围内，你将如何优化你的算法？
如果数据流中 99% 的整数都在 0 到 100 范围内，你将如何优化你的算法？

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/find-median-from-data-stream
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author zhudeshuai
 * @since 2019/8/13
 */

class MedianFinder {

    private var containerSet = mutableListOf<Int>()

    fun addNum(num: Int) {
        containerSet.add(num)
    }

    fun findMedian(): Double {
        containerSet.sort()
        val size = containerSet.size
        return if (size % 2 == 0) {
            ((containerSet[size / 2] + containerSet[size / 2 - 1]) / 2.0f).toDouble()
        } else {
            containerSet[size / 2].toDouble()
        }
    }

}

fun main() {
    val findMedian = MedianFinder().apply {
        addNum(6)
        addNum(10)
        addNum(2)
        addNum(6)
        addNum(5)
    }.findMedian()
    println(findMedian)
}